package com.tedu.day02.oop;

/**
 * 抽象类：抽象类与抽象方法  关键字：abstract
 * 类：只能提供行为概念，没有具体实现行为
 *
 * 抽象类与面向对象中的多态有绝对关系【向上造型创建抽象对象】
 * 使用多太创建抽象类对象，抽象类本身无法创建对象，需要适应多态完成抽象类创建
 *
 * 什么情况下使用抽象类？
 * 复杂项目时，需要在不同类下实现不同的功能，首先抽象类【Android常用】
 *
 * 定义抽象类与抽象方法
 * 抽象类：修饰符abstract  class  类名{} --------毫无意义，必须结合抽象方法
 * 抽象方法：修饰符  返回值  方法名(参数);---没有具体的实现
 *
 * 抽象类”实例化：创建对象“：抽象类自身无法实例化
 * ①创建子类  --可以创建N个  继承抽象【父】类，子类一定实现抽象【父】类的所有抽象方法
 * ②使用面向对象：多态【向上造型】  抽象类 引用=new 【实现】子类();
 * 注意：抽象类一定发生重写，子类继承抽象【父】类，也可以叫做“实现类”！
 */
abstract class Animals{  //抽象类
    //抽象方法
    public abstract void say();  //报错 没有具体的实现【代码段】--一定继承--一定多态性 去掉{}
    //①定义由final进行修饰的抽象方法是不可以的
//    public final abstract void sleep();
    //②定义抽象变量   是不存在的
//    abstract int i=1;
    //③定义静态变量      可以
   static int i=1;
   //④定义静态抽象变量    不可以
//   static abstract int j=2;
    //⑤定义静态的抽象方法【无实现】 不可以
//    public static abstract void eat();
    //⑥定义静态的方法【无实现+空代码块】  可以
    public static  void eat(){};
    //总结⑤⑥：抽象方法/静态方法。方法定义：修饰符 static或者abstract 返回值 方法名
    //⑦可以定义内部类【静态内部类】 可以
   static class Sos{}
    //⑧抽象类有构造器
    public Animals() {
    }
    //⑨抽象类可以有普通实现方法
    public void run(){}
}
   //⑩抽象类可以继承抽象类  实现:两个抽象类来形容一个实现
abstract class Thing extends Animals{
    public abstract void sleep();
   }
//目的：两个抽象类中所有抽象方法--继承【子】抽象类


//实现类：实现抽象[父]类的方法  可以多个实现类 继承 抽象
class Person1 extends Animals{  //报错原因：需要完成重写
    public void say() {
        System.out.println("人--说话~");
    }

}
public class 抽象类 {
    public static void main(String[] args) {
        //抽象类无法实例化:提供抽象方法--必须有子类实现---多态【造型】
        Animals a=new Person1();
        a.say();//向上造型---重写抽象父类的抽象方法--完成覆盖

    }
}
